package com.spzx.product.api;

import com.spzx.common.core.constant.SecurityConstants;
import com.spzx.common.core.constant.ServiceNameConstants;
import com.spzx.common.core.domain.R;
import com.spzx.product.api.domain.vo.CategoryVo;
import com.spzx.product.api.factory.RemoteCategoryFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;

import java.util.List;

/**
 * 分类远程调用接口
 */
@FeignClient(contextId = "remoteCategoryService",name = ServiceNameConstants.PRODUCT_SERVICE,fallbackFactory = RemoteCategoryFallbackFactory.class)
public interface RemoteCategoryService {

    /**
     * 声明远程接口：与远程controller的方法声明一致。
     *      涉及问题：如何携带请求头。
     *          1.远程接口声明@InnerAuth注解，切面需要提供请求头：'from-source',值必须是'inner'
     *              在调用远程接口时声明携带我们请求头即可。
     *                  携带一个头信息：@RequestHeader(SecurityConstants.FROM_SOURCE) String source
     *                  携带多个头信息：Map、MultiValueMap、HttpHeaders 见：@RequestHeader类注释
     *          2.携带全局头信息
     *              openFeign远程调用，会丢失请求头。如果还需要携带请求头，可以使用feign.RequestInterceptor接口(OpenFeign组件提供)开发实现类，进行请求拦截，挂请求头。
     * @return
     */
    @GetMapping(value = "/category/getOneCategory")
    public R<List<CategoryVo>> getOneCategory(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 获取三级分类(立即加载)
     * @param source
     * @return 分类树结构
     */
    @GetMapping(value = "/category/tree")
    public R<List<CategoryVo> > tree(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
